package comptadub

class PaiementController {
	
	def grailsApplication

    def exportService
    def membreService
    def compteService

    static allowedMethods = [save: "POST", update: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }

    def list = {
        flash.objet = params.objet
        flash.membre = params.membre

        if (!params.max) params.max = 10
        if (!params.sort) params.sort = "id"
        if (!params.order) params.order = "desc"
        if (!flash.membre) flash.membre = session.idMembre.toString()

        def query = {
            and {
                if(flash.objet) {
                    like("objet", '%' + flash.objet + '%')
                }

                if (flash.membre != '0') {
                    def selMembre = Membre.get(flash.membre.toInteger())
                    eq("membre", selMembre)
                }
            }
        }

        def criteria = Paiement.createCriteria()
        def results = criteria.list(params, query)

        [ paiementInstanceList: results ]
    }

    def export = {
        flash.objet = params.objet
        flash.membre = params.membre
        params.max = null
        params.offset = null

        if (!params.sort) params.sort = "id"
        if (!params.order) params.order = "desc"

        def query = {
            and {
                if(flash.objet) {
                    like("objet", '%' + flash.objet + '%')
                }

                if (flash.membre != '0') {
                    def selMembre = Membre.get(flash.membre.toInteger())
                    eq("membre", selMembre)
                }
            }
        }

        def criteria = Paiement.createCriteria()
        def results = criteria.list(params, query)

        if(params?.format && params.format != "html")
        {
            response.contentType = grailsApplication.config.grails.mime.types[params.format]
            response.setHeader("Content-disposition", "attachment; filename=paiement.${params.extension}")
            List fields = ["membre.nom", "date", "credit", "objet", "commentaire", "type.nom"]
            Map labels = ["membre.nom": "membre", "credit": "montant", "type.nom": "moyenPaiement"]
            exportService.export(params.format, response.outputStream, results, fields, labels, [:], [:])
        }
    }

    def create = {
        def paiementInstance = new Paiement()
        paiementInstance.membre = Membre.get(session.idMembre.toString())
        paiementInstance.properties = params
        return [paiementInstance: paiementInstance]
    }

    def save = {
        def paiementInstance = new Paiement(params)
        compteService.definirObjet(paiementInstance)
        
        if (paiementInstance.save(flush: true)) {
            flash.message = "${message(code: 'paiement.created.message')}"
            membreService.calculerSolde(paiementInstance.membre?.id)
            redirect(action: "show", id: paiementInstance.id)
        }
        else {
            render(view: "create", model: [paiementInstance: paiementInstance])
        }
    }

    def show = {
        def paiementInstance = Paiement.get(params.id)
        if (!paiementInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'paiement.label', default: 'Paiement'), params.id])}"
            redirect(action: "list")
        }
        else {
            [paiementInstance: paiementInstance]
        }
    }

    def edit = {
        def paiementInstance = Paiement.get(params.id)
        if (!paiementInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'paiement.label', default: 'Paiement'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [paiementInstance: paiementInstance]
        }
    }

    def update = {
        def paiementInstance = Paiement.get(params.id)

        if (paiementInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (paiementInstance.version > version) {
                    paiementInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'paiement.label', default: 'Paiement')] as Object[], "Another user has updated this Paiement while you were editing")
                    render(view: "edit", model: [paiementInstance: paiementInstance])
                    return
                }
            }
            paiementInstance.properties = params
            compteService.definirObjet(paiementInstance)
            
            if (!paiementInstance.hasErrors() && paiementInstance.save(flush: true)) {
                flash.message = "${message(code: 'paiement.updated.message')}"
                membreService.calculerSolde(paiementInstance.membre?.id)
                redirect(action: "show", id: paiementInstance.id)
            }
            else {
                render(view: "edit", model: [paiementInstance: paiementInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'paiement.label', default: 'Paiement'), params.id])}"
            redirect(action: "list")
        }
    }

    def delete = {
        def paiementInstance = Paiement.get(params.id)
        if (paiementInstance) {
            try {
                paiementInstance.delete(flush: true)
                flash.message = "${message(code: 'paiement.deleted.message')}"
                membreService.calculerSolde(paiementInstance.membre?.id)
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'paiement.label', default: 'Paiement'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'paiement.label', default: 'Paiement'), params.id])}"
            redirect(action: "list")
        }
    }
}
